package cn.lingyangwl.agile.pay.common.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Objects;

/**
 * @author shenguangyang
 */
public class AmountUtils {

    /**
     * 元转成分
     */
    public static BigDecimal yuanToFen(BigDecimal yuan) {
        return yuan.multiply(new BigDecimal("100"));
    }

    /**
     * 分转成元
     */
    public static BigDecimal fenToYuan(BigDecimal fen) {
        // DOWN 直接删除多余的小数位
        return fen.divide(new BigDecimal("100"), 2, RoundingMode.DOWN);
    }

    /**
     * 分转成元
     */
    public static BigDecimal fenToYuan(Integer fen) {
        if (Objects.isNull(fen)) {
            return new BigDecimal(0);
        }
        // DOWN 直接删除多余的小数位
        return new BigDecimal(fen).divide(new BigDecimal("100"), 2, RoundingMode.DOWN);
    }

    public static BigDecimal fenToYuan(Long fen) {
        if (Objects.isNull(fen)) {
            return new BigDecimal(0);
        }
        // DOWN 直接删除多余的小数位
        return new BigDecimal(fen).divide(new BigDecimal("100"), 2, RoundingMode.DOWN);
    }

    /**
     * 计算百分比类型的各种费用值  （订单金额 * 真实费率  结果四舍五入并保留0位小数 ）
     *
     * @param amount 订单金额  （保持与数据库的格式一致 ，单位：元）
     * @param rate   费率   （保持与数据库的格式一致 ，真实费率值，如费率为0.55%，则传入 0.0055）
     */
    public static BigDecimal calPercentageFee(BigDecimal amount, BigDecimal rate) {
        return calPercentageFee(amount, rate, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 计算百分比类型的各种费用值  （订单金额 * 真实费率  结果四舍五入并保留0位小数 ）
     *
     * @param amount 订单金额  （保持与数据库的格式一致 ，单位：元）
     * @param rate   费率   （保持与数据库的格式一致 ，真实费率值，如费率为0.55%，则传入 0.0055）
     * @param mode   模式 参考：BigDecimal.ROUND_HALF_UP(四舍五入)   BigDecimal.ROUND_FLOOR（向下取整）
     */
    public static BigDecimal calPercentageFee(BigDecimal amount, BigDecimal rate, int mode) {
        //费率乘以订单金额   结果四舍五入并保留0位小数
        return yuanToFen(amount).multiply(rate).setScale(0, mode);
    }

    public static BigDecimal add(BigDecimal v1, BigDecimal v2) {
        if (v1 == null) {
            v1 = new BigDecimal(0);
        } else if (v2 == null) {
            v2 = new BigDecimal(0);
        }
        return v1.add(v2);
    }
}
